%pylab inline
import matplotlib.pyplot as plt
# a szinekhez tartozo toroesmutatok:
nred = 1.33; ngreen = 1.335; nblue = 1.34;
# 'r' ---> red, 'g' ---> green, 'b' ---> blue
nszinek = {"r":nred, "g":ngreen, "b":nblue} # dictionary type variable
nszinek['b']
Input: $ \mathbf{i}, \mathbf{N}$ és $n_1, n_2$.
Output (az alábbiak szerint számított): $ \mathbf{r}, \mathbf{t}$
\begin{eqnarray} \mathbf{r} &=& \mathbf{i} \left[\mathbf{1}- 2 \mathbf{N}\circ\mathbf{N} \right] = \mathbf{i} - 2 \left( \mathbf{i} \mathbf{N} \right) \mathbf{N} \nonumber \\ n_2 \mathbf{t} &=& n_1 \mathbf{i} + \mathbf{N}\left(n_1 \cos\vartheta_1 -n_2 \cos\vartheta_2 \right), \,\, \textrm{ahol} \nonumber \\ \cos \vartheta_1 &=& - \mathbf{i N}, \nonumber \\ n_1 \sin \vartheta_1 &=& n_2 \sin \vartheta_2 \nonumber . \end{eqnarray}
def tores(n2,n1,be,normal):
'''
Snellius-Descartes-torveny: torestorveny,
a t vektor szamolasa adott i es N vektorok eseten
n1: a bal oldalon a toresmutato
n2: jobb oldalon a toresmutato
'''
cos1=-dot(be,normal)
sin1= sqrt(1-cos1**2)
sin2= n1*sin1/n2
cos2=sqrt(1-sin2**2)
tv=n1/n2*be+(n1/n2*cos1-cos2)*normal
return(tv)
def line_circle(r0,be,cent,R,elojel):
'''
a kor es az egyenes metszespontjat szamolja
r0 =(x0,y0) az egyenes egy pontja
be: az egyenes iranyvektora (unit vector!)
cent: a kor kozeppontja
R: a kor sugara
'''
cr=cent-r0
l= dot(cr,be)
cr3=array([cr[0],cr[1],0])
be3=array([be[0],be[1],0])
rhovec=cross(cr3,be3)
rho= sqrt(dot(rhovec,rhovec))
s= sqrt(R**2-rho**2)
lsp=l+elojel*s
x1=r0[0]+lsp*be[0]
y1=r0[1]+lsp*be[1]
rp=array([x1,y1]) # a kor es az egyenes metszespontja
tmp=elojel*(cent-array([x1,y1]))
normal=tmp/sqrt(dot(tmp,tmp))
return(rp,normal)
def one_ray_gomb(n2,n1,be,r0,cent,R,elojel):
# be : bejovo sugar iranyvektora (unit vector),
# r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai
# cent: a kor kozeppontja
# R; a kor sugara
# elojel: eldonti, hogy a ket metszespont kozul melyiket valasszuk
(r1,normal) = line_circle(r0,be,cent,R,elojel)
x1= r1[0]
y1= r1[1]
tv=tores(n2,n1,be,normal)
tmax=3 # ezzel a megtort sugar hosszat allithatjuk be
x2=tv[0]*tmax+x1
y2=tv[1]*tmax+y1
# a lencse alakja
Np = 100
#plot([0,0],[R,-R],color='k', lw=1)
fi=linspace(-pi/2,pi/2,Np)
plot(cent[0]+R*cos(fi),cent[1]+R*sin(fi), color='k', lw=1)
# bemeno sugar
plot([r0[0],x1],[r0[1],y1],color='b',lw=1)
# a kimeno sugar
plot([x1,x2],[y1,y2],color='r',lw=1);
#ax.set_xlim(-R*1.05, R*1.05)
#ax.set_ylim(-R*1.05, R*1.05)
ax.set_axis_off()
def ellipszis_lencse(y, f, n1, n2):
'''
A lencse alakjat leiro fuggveny: z(y) egy ellipszis egyenletet elegiti ki
(megmutatható a Fermat-elv alapján).
Itt z --> vizszintes tengely, y --> fuggoleges tengely
n1 a baloldali, n2 a jobboldali tartomany toresmutatoja.
A fenysugar balrol jobbra halad.
n1: a bal oldalon a toresmutato
n2: jobb oldalon a toresmutato
Input: $y, f, n_1, n_2$.
Output: z erteke adott y-ra, es a lencse gorbejenek (z,y) pontjaban a
a felulet normalvektora, 'nv'.
'''
n=n1/n2
a=f/(1+n)
b2=f**2*(1-n)/(1+n)
z=a*(1-sqrt(1-y**2/b2))
normalv=a/b2*y/sqrt(1-y**2/b2)
nz=1/sqrt(1+normalv**2)
ny=-normalv/sqrt(1+normalv**2)
# a z(y) gorbere meroleges normalvektor
nv=-array([nz,ny])
return(z,nv)
def one_ray_ellipszis(f,n1,n2,be,x0,y0):
x1, nv = ellipszis_lencse(y0, f, n1, n2)
tv=tores(n2,n1,be,nv)
y1=y0
tmax=2 # ezzel a megtort sugar hosszat allithatjuk be
x2=tv[0]*tmax+x1
y2=tv[1]*tmax+y1
plot([x0,x1],[y0,y1],color='b',lw=1)
plot([x1,x2],[y1,y2],color='r',lw=1);
ax.set_axis_off()
Sugármenetek rajzolása féldomború (sík-gömb) lencsén keresztül
n1,n2 = (3/2,1)
R=1
cent=array([0,0]) # cent: a kor kozeppontja
elojel=1
r0=array([-1.5*R,0.25*R]) # r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai
be_szog= 15*pi/180
be=array([cos(be_szog),sin(be_szog)]) # be : bejovo sugar iranyvektora (unit vector)
figsize(10,10)
ax=subplot(aspect='equal')
one_ray_gomb(n2,n1,be,r0,cent,R,elojel)
n1,n2 = (3/2,1)
Np=20
R=1
cent=array([0,0]) # cent: a kor kozeppontja
elojel=1
r0=array([-1.5*R,0.5*R]) # r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai
be_szog= 0*pi/180
be=array([cos(be_szog),sin(be_szog)]) # be : bejovo sugar iranyvektora (unit vector)
figsize(10,10)
ax=subplot(aspect='equal')
x0=-1.*R
y0list=linspace(-n2/n1,n2/n1,Np)
#y0list=linspace(-R,R,Np)
[one_ray_gomb(n2,n1,be,array([x0,y0]),cent,R,elojel) for y0 in y0list];
n1,n2 = (3/2,1)
Np=20
R=1
cent=array([0,0]) # cent: a kor kozeppontja
elojel=1
r0=array([-1.5*R,0.5*R]) # r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai
be_szog= 30*pi/180
be=array([cos(be_szog),sin(be_szog)]) # be : bejovo sugar iranyvektora (unit vector)
figsize(10,10)
ax=subplot(aspect='equal')
x0=-0.5*R
#y0lit=linspace(-n2/n1,n2/n1,Np)
y0list=linspace(-1.0*R,0.4*R,Np)
#y0list=linspace(-R,R,Np)
[one_ray_gomb(n2,n1,be,array([x0,y0]),cent,R,elojel) for y0 in y0list];
A lencse alakja ellipszis (megmutatható a Fermat-elv alapján). A görbe egyenletét a $z(y)$ függvénnyel adjuk meg az alábbiak szerint (itt $z$ a viszintes, $y$ a függőleges tengely).
Input: $f, n_1, n_2$.
A lencse görbéjének egyenlete ellipszis:
$\frac{{\left(z-a\right)}^2}{a^2}+\frac{y^2}{b^2} =1$, ahol
$a = f \frac{1}{n+1}$,
$b^2 = f^2 \frac{1-n}{1+n}$, Ha n=n1/n2 > 1, akkor b/2 < 0 -- hiperbola
$n = n_1/n_2$.
Innen $z(y)$:
$z(y) = a \left(1-\sqrt{1-\frac{y^2}{a^2}}\right)$.
Nplencse=100
n1,n2 = (3/2,1)
f=1
# lencse alakjahoz
ym=0.8
y=linspace(-ym,ym,Nplencse)
z,nv = ellipszis_lencse(y, f, n1, n2)
figsize(10,10)
ax=subplot(aspect='equal')
plot(z,y,color='k'); # a lencse alakja
Np=16 # bejovo sugarak szama
be=array([1,0])
y0list=linspace(-ym,ym,Np)
#y0list=linspace(-R,R,Np)
[one_ray_ellipszis(f,n1,n2,be,-f,y0) for y0 in y0list];
Nplencse=100
n1,n2 = (1,3/2)
f=1
# lencse alakjahoz
ym=0.4
y=linspace(-ym,ym,Nplencse)
z,nv = ellipszis_lencse(y, f, n1, n2)
figsize(10,10)
ax=subplot(aspect='equal')
plot(z,y,color='k'); # a lencse alakja
Np=10 # bejovo sugarak szama
be=array([1,0])
y0list=linspace(-ym,ym,Np)
#y0list=linspace(-R,R,Np)
[one_ray_ellipszis(f,n1,n2,be,-f,y0) for y0 in y0list];